package v1

import (
	"ginblog/model"
	"ginblog/utils/errormsg"
	"ginblog/utils/validator"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

// 查询用户是否存在
func UserExist(c *gin.Context) {
	// 用户是否存在
	//model.CheckUser()
}

// 添加用户
func AddUser(c *gin.Context) {
	// 添加用户
	var data model.User
	var msg string
	// 将该请求获取的值 根据json 传给对应的 data 中的字段 这里是通过ShouldBindJson来解析json给data的
	_ = c.ShouldBindJSON(&data)
	// 判断data是否合法 验证功能
	msg, code := validator.Validate(data)
	// 返回给端上对应的失败的代码以及失败信息
	if code != errormsg.SUCCESS {
		c.JSON(http.StatusOK, gin.H{
			"status":  code,
			"message": msg,
		})
		return
	}

	// 判断用户名是否已经存在
	code = model.CheckUser(data.Username)
	// 返回success 则代表不存在可以创建
	if code == errormsg.SUCCESS {
		// 这里调用创建用户的方法
		model.CreateUser(&data)
	}
	// 如果已经存在 code设为对应的错误码
	if code == errormsg.ERROR_USERNAME_USED {
		code = errormsg.ERROR_USERNAME_USED
	}
	// 返回json格式的数据 gin.H是一个哈希表 返回对应的状态码 数据 和 提示 （json进行数据的压缩）
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 查询单个用户
func GetUserInfo(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	data, code := model.GetUser(id)
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"total":   1,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 查询用户列表
func GetUsers(c *gin.Context) {
	// 分页查询 获取每页的数量和页数
	pageSize, _ := strconv.Atoi(c.Query("pagesize"))
	pageNum, _ := strconv.Atoi(c.Query("pagenum"))
	username := c.Query("username")
	// 如果是0 则不需分页限制 设置pageSize为-1
	if pageSize == 0 {
		pageSize = -1
	}
	// 如果是0 则不需分页限制 设置pageNum为-1
	if pageNum == 0 {
		pageNum = 1
	}
	// 得到对应的数据
	data, total := model.GetUsers(username, pageSize, pageNum)
	// 获取对应的状态码
	code := errormsg.SUCCESS
	// 返回json格式的数据
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"total":   total,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 编辑用户
func EditUser(c *gin.Context) {
	// 获取前端传过来的 id和user结构体
	var data *model.User
	c.ShouldBindJSON(&data)
	id, _ := strconv.Atoi(c.Param("id"))
	// 检查更新的用户名是否存在 如果存在 不能更改
	code := model.CheckUpUser(id, data.Username)
	if code == errormsg.SUCCESS {
		model.EditUser(id, data)
	}
	// 禁止执行
	if code == errormsg.ERROR {
		c.Abort()
	}
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 删除用户
func DeleteUser(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	code := model.DeleteUser(id)
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 修改密码
func ChangePw(c *gin.Context) {
	var data model.User
	id, _ := strconv.Atoi(c.Param("id"))
	_ = c.ShouldBindJSON(&data)
	code := model.ChangePw(id, &data)
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}
